這邊的自動連線指的是自動識別電腦連接我們所需使用的線材,一般來說我們電腦在連接RS-485或RS-232通訊協定的裝置都會先到裝置管理員的連接埠確認目前使用的是哪個COM Port。以下圖為例,目前使用的為COM8。
應用程式就要設計個選擇COM Port、重新整理及連接的按鍵來實現連線功能。
但這樣做對不熟悉COM Port的人來說使用上並不方便。
所以根據這個需求可以設計一下COM Port自動連線這個功能,流程圖大致就是 每過固定時間檢查COM Port->取得 Port細節->比對Port號->Port連線
public SerialPortViewModel()
{
_timer.Tick += new EventHandler(GetRightPort); //依特定時間間隔執行,直到迴圈完成的程序。
_timer.Start();
}
public void GetRightPort(object? sender, EventArgs e)
{
PortsDetailOptions = GetPortsDetail();
CheckRightPort(PortsDetailOptions);
ConnectSelectedSerialPort();
if (CheckConnectAskOrigin == 1 ) CheckOriginDataTimer();
}
public List<string> GetPortsDetail()
{
List<string> ports = new List<string>();
using (ManagementClass i_Entity = new ManagementClass("Win32_PnPEntity"))
//Win32_PnPEntity類別代表隨插即用裝置的屬性。
{
foreach (ManagementObject i_Inst in i_Entity.GetInstances())
{
string tempPortDetail;
Object o_Guid = i_Inst.GetPropertyValue("ClassGuid");
if (o_Guid == null || o_Guid.ToString().ToUpper() != "{4D36E978-E325-11CE-BFC1-08002BE10318}")
continue; // Skip all devices except device class "PORTS"
String s_Caption = i_Inst.GetPropertyValue("Caption").ToString(); //Description
String s_Manufact = i_Inst.GetPropertyValue("Manufacturer").ToString(); //Manufacturer
String s_DeviceID = i_Inst.GetPropertyValue("PnpDeviceID").ToString(); //Device ID
String s_RegPath = "HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Enum\\" + s_DeviceID + "\\Device Parameters";
String s_PortName = Registry.GetValue(s_RegPath, "PortName", "").ToString(); //COM Number
int s32_Pos = s_Caption.IndexOf(" (COM");
if (s32_Pos > 0) // remove COM port from description
s_Caption = s_Caption.Substring(0, s32_Pos);
tempPortDetail = s_PortName + "-" + s_Caption;
ports.Add(tempPortDetail);
}
}
return ports;
}
public void CheckRightPort(List<string> value)
{
string caption;
foreach (string s in value)
{
caption = GetSelectedCaption(s);
if (caption == "Prolific USB-to-Serial Comm Port" ) //填入線材名稱
{
PortName = GetSelectedPortName(s);
CheckConnectAskOrigin = 1;
_timer.Stop();
}
}
}
private void ConnectSelectedSerialPort()
{
if(PortName != null)
{
try
{
SelectedSerialPort = new SerialPort(PortName, SelectedSerialPortBaudRateInt, Parity.None, 8, StopBits.One);
SelectedSerialPort.Open();
ConnectVisibility = Visibility.Hidden;
ConnectPCircleVisibility = Visibility.Visible;
SelectedSerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedEvent);
MainViewTabControlVisibility = Visibility.Visible;
SetupProcessPromptMessageTblVisibility = Visibility.Visible;
SetupProcessPromptMessageTblText = "Enter the correct password to change the speed limit!";
SelectedSerialPortConnectedBool = true;
SelectedSerialPortDisconnectedBool = false;
}
catch (Exception)
{
_timer.Start();
MessageBox.Show("Can Not Open Selected Serial Port!");
}
}
}